#!/bin/bash

# Jpom 自动构建部署脚本
# 用于接收 Webhook 触发后的自动构建和部署

set -e  # 遇到错误立即退出

# 配置变量
PROJECT_NAME="tetris-game"
PROJECT_DIR="/opt/jpom/projects/${PROJECT_NAME}"
DOCKER_IMAGE_NAME="tetris-game"
DOCKER_CONTAINER_NAME="tetris-game"
DOCKER_PORT="3000"
GIT_REPO="https://gitee.com/cailei/tetris-game.git"  # 请替换为您的仓库地址

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 错误处理函数
error_exit() {
    log "ERROR: $1"
    exit 1
}

log "🚀 开始自动构建部署 ${PROJECT_NAME}..."

# 0. 检查 Docker 环境
log "🔍 检查 Docker 环境..."
if ! command -v docker &> /dev/null; then
    error_exit "Docker 未安装或不在 PATH 中"
fi

if ! docker info &> /dev/null; then
    log "⚠️ Docker 服务可能未启动，尝试启动..."
    sudo systemctl start docker || error_exit "无法启动 Docker 服务"
    sleep 3
fi

# 设置 Docker 环境变量，避免配置文件问题
export DOCKER_CONFIG="/tmp/.docker-$$"
export DOCKER_CLI_EXPERIMENTAL=enabled

# 尝试创建临时配置目录，如果失败则跳过
if mkdir -p "$DOCKER_CONFIG" 2>/dev/null; then
    log "✅ 创建临时 Docker 配置目录: $DOCKER_CONFIG"
else
    log "⚠️ 无法创建 Docker 配置目录，使用默认配置"
    unset DOCKER_CONFIG
fi

log "✅ Docker 环境检查完成"

# 1. 创建项目目录
log "📁 准备项目目录..."
mkdir -p "${PROJECT_DIR}"
cd "${PROJECT_DIR}"

# 2. 拉取最新代码
log "📥 拉取最新代码..."
if [ -d ".git" ]; then
    log "更新现有仓库..."
    git fetch origin
    git reset --hard origin/main
    git clean -fd
else
    log "克隆新仓库..."
    git clone "${GIT_REPO}" .
fi

# 3. 停止并删除旧容器
log "🛑 停止旧容器..."
# 强制停止容器（如果正在运行）
if docker ps --format 'table {{.Names}}' | grep -q "^${DOCKER_CONTAINER_NAME}$"; then
    log "停止运行中的容器: ${DOCKER_CONTAINER_NAME}"
    docker stop "${DOCKER_CONTAINER_NAME}" || true
fi

# 删除容器（无论是否在运行）
if docker ps -a --format 'table {{.Names}}' | grep -q "^${DOCKER_CONTAINER_NAME}$"; then
    log "删除容器: ${DOCKER_CONTAINER_NAME}"
    docker rm -f "${DOCKER_CONTAINER_NAME}" || true
fi

log "✅ 旧容器清理完成"

# 4. 删除旧镜像（可选，节省空间）
log "🗑️ 清理旧镜像..."
# 删除同名的旧镜像，但保留 latest 标签以外的其他版本
docker images "${DOCKER_IMAGE_NAME}:latest" -q | head -1 | xargs -r docker rmi -f || true
log "✅ 旧镜像清理完成"

# 5. 构建新镜像
log "🔨 构建 Docker 镜像..."
docker build -t "${DOCKER_IMAGE_NAME}:latest" . || error_exit "Docker 镜像构建失败"

# 6. 启动新容器
log "🚀 启动新容器..."
docker run -d \
    --name "${DOCKER_CONTAINER_NAME}" \
    --restart unless-stopped \
    -p "${DOCKER_PORT}:80" \
    "${DOCKER_IMAGE_NAME}:latest" || error_exit "容器启动失败"

# 7. 等待容器启动
log "⏳ 等待容器启动..."
sleep 5

# 8. 检查容器状态
if docker ps --format 'table {{.Names}}' | grep -q "^${DOCKER_CONTAINER_NAME}$"; then
    log "✅ 容器启动成功！"
    log "🌐 访问地址: http://82.157.51.127:${DOCKER_PORT}"
else
    error_exit "容器启动失败，请检查日志"
fi

# 9. 清理无用的镜像和容器
log "🧹 清理无用资源..."
docker system prune -f || true

# 10. 显示容器信息
log "📊 容器信息:"
docker ps --filter "name=${DOCKER_CONTAINER_NAME}" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

log "🎉 部署完成！"
log "🎮 俄罗斯方块游戏已成功部署到: http://82.157.51.127:${DOCKER_PORT}"

# 11. 清理临时 Docker 配置目录
if [ -n "$DOCKER_CONFIG" ] && [ -d "$DOCKER_CONFIG" ]; then
    rm -rf "$DOCKER_CONFIG" || true
fi

# 12. 发送部署通知（可选）
# curl -X POST "https://your-notification-webhook.com" \
#      -H "Content-Type: application/json" \
#      -d "{\"message\": \"🎮 俄罗斯方块游戏部署成功！访问地址: http://82.157.51.127:${DOCKER_PORT}\"}"

exit 0
